class Solution {
    int[] dx={0,0,1,-1};
    int[] dy={1,-1,0,0};
    public int nearestExit(char[][] maze, int[] e) {
        int step =0;
        int m = maze.length;
        int n = maze[0].length;
        boolean[][] vis = new boolean[m][n];//标记是否访问
        Queue<int[]> q = new LinkedList<>();
        q.add(e);
        vis[e[0]][e[1]] = true;

        while(!q.isEmpty()) {
            step++;//一层开始遍历之前step++
            //要同时向外扩展sz次
            int sz = q.size();
            for(int i=0;i<sz;i++) {
                int[] t = q.poll();
                int a = t[0];
                int b = t[1];
                vis[a][b] = true;
                for(int j=0;j<4;j++) {
                    int x = a+dx[j];
                    int y = b+dy[j];
                    if(x>=0&&x<m&&y>=0&&y<n&&maze[x][y]=='.'&& !vis[x][y]) {
                        //判断是否到达出口
                        if(x==0||x==m-1||y==0||y==n-1) {
                            return step;
                        }
                        q.add(new int[]{x,y});
                        vis[x][y] = true;//这里不要忘了遍历过了要记录一下
                    }
                }
            }

        }
        return -1;//没有出口-1
    }
}